import fetch from "node-fetch"
import plugin from "../../../lib/plugins/plugin.js"
import MysInfo from "../model/mys/mysInfo.js"

export class takeBirthdayPhoto extends plugin {
  constructor() {
    super({
      name: "留影叙佳期",
      dsc: "留影叙佳期",
      event: "message",
      priority: 5000,
      rule: [
        {
          reg: "^#?(留影(叙佳期)?|((领)?((角色)?生日)(卡)?))$",
          fnc: "birthdaystar"
        }
      ]
    })
    this.button = segment.button([ { text: "留影叙佳期", input: "#留影叙佳期" } ])
  }

  async birthdaystar(e) {
    let uid = await MysInfo.getUid(this.e)
    if (!uid) return false
    let ck = await MysInfo.checkUidBing(uid, this.e)
    if (!ck) {
      e.reply([ "请先绑定ck再使用本功能哦~", segment.button([ { text: "Cookie帮助", callback: "#Cookie帮助" } ]) ], true)
      return true
    }

    this.region = await this.getServer(uid)
    this.game_biz = this.region.includes("cn") ? "hk4e_cn" : "hk4e_global"

    const e_hk4e_token = await this.getEHK4EToken(ck.ck, uid)
    if (!e_hk4e_token) {
      e.reply([ "获取e-hk4e_token失败，请刷新ck后再试~", this.button ], true)
      return true
    }

    const birthday_star_list = await this.getBirthdayStar(uid, e_hk4e_token, ck.ck)
    if (!birthday_star_list) {
      e.reply([ "获取生日角色失败，请稍后再试~", this.button ], true)
      return true
    }

    if (birthday_star_list.length === 0) {
      e.reply([ "今天没有生日角色哦~", this.button ], true)
      return true
    }

    try {
      for (const role of birthday_star_list) {
        await e.reply(`正在获取${role.name}的图片，请稍等~`, true)
        await e.reply(segment.image(role.take_picture))
        const message = await this.getBirthdayStarImg(uid, e_hk4e_token, ck.ck, role.role_id)
        if (message != "success") {
          await e.reply([ message, this.button ])
          return true
        } else {
          await e.reply(`获取${role.name}的图片成功~`, true)
        }
      }
    } catch (error) {
      await e.reply([ "获取角色留影叙佳期图片失败，可能是ck失效...", this.button ], true)
      logger.error(error)
    }

    return true
  }

  async getEHK4EToken(ck, uid) {
    const url = this.region.includes("cn") ? "https://api-takumi.mihoyo.com/common/badge/v1/login/account" : "https://api-os-takumi.mihoyo.com/common/badge/v1/login/account"
    const headers = {
      "Cookie": ck,
      "Content-Type": "application/json;charset=UTF-8",
      "Referer": "https://webstatic.mihoyo.com/",
      "Origin": "https://webstatic.mihoyo.com"
    }
    const body = JSON.stringify({
      uid: Number(uid),
      game_biz: this.game_biz,
      lang: "zh-cn",
      region: this.region
    })
    let res = await fetch(url, { method: "POST", body, headers })
    const e_hk4e_token = res.headers.get("set-cookie").match(/e_hk4e_token=(.*?);/)[1]
    res = await res.json()
    if (res.retcode != 0) {
      return false
    }
    return e_hk4e_token
  }

  async getServer(uid) {
    switch (String(uid).slice(0, -8)) {
      case "1":
      case "2":
        return "cn_gf01"
      case "5":
        return "cn_qd01"
      case "6":
        return "os_usa"
      case "7":
        return "os_euro"
      case "8":
      case "18":
        return "os_asia"
      case "9":
        return "os_cht"
    }
    return "cn_gf01"
  }

  async getBirthdayStar(uid, e_hk4e_token, ck) {
    const headers = { Cookie: `e_hk4e_token=${e_hk4e_token};${ck}` }
    const url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/index?lang=zh-cn&badge_uid=${uid}&badge_region=${this.region}&game_biz=${this.game_biz}&activity_id=20220301153521`
    let res = await fetch(url, { headers })
    res = await res.json()
    return res.data.role
  }

  async getBirthdayStarImg(uid, e_hk4e_token, ck, role_id) {
    const headers = { Cookie: `e_hk4e_token=${e_hk4e_token};${ck}` }
    const url = `https://hk4e-api.mihoyo.com/event/birthdaystar/account/post_my_draw?lang=zh-cn&badge_uid=${uid}&badge_region=${this.region}&game_biz=${this.game_biz}&activity_id=20220301153521`
    const body = JSON.stringify({ role_id: Number(role_id) })
    let res = await fetch(url, { method: "POST", body, headers })
    res = await res.json()

    if (res.retcode != 0) return res.message
    else return "success"
  }
}
